home *** CD-ROM | disk | FTP | other *** search
- (*===========================================================================*)
- (* Send msg to -- subroutines *)
- (* *)
- (* Copyright 1988, 1989, 1990, 1991, 1992 by H. Roy Engehausen. All *)
- (* rights reserved. *)
- (* *)
- (*===========================================================================*)
-
- PROCEDURE more_address;
-
- VAR
- i : BYTE;
- j : INTEGER;
- k : BYTE;
- l : BYTE;
-
- BEGIN;
-
- WITH active_tcb^.curr_msg.msg_i_mb DO
- WHILE address_string <> '' DO
- BEGIN;
-
- (*-----------------------------------------------------------------*)
- (* Get the data we need *)
- (*-----------------------------------------------------------------*)
-
- save_char := address_string[1];
- word_cnt := words(address_string);
- word_string := upcase_str(subword(@address_string, 2, 1));
-
- (*-----------------------------------------------------------------*)
- (* Don't allow < unless BBS or higher *)
- (*-----------------------------------------------------------------*)
-
- IF (save_char = '<')
- AND ((active_tcb^.uid_data.user_flag AND user_f_pbbs) = 0)
- AND (active_tcb^.uid_data.user_class < user_c_bu) THEN
- save_char := ' ';
-
- (*-----------------------------------------------------------------*)
- (* Execute proper routine *)
- (*-----------------------------------------------------------------*)
-
- CASE save_char OF
-
- (*---------------------------------------------------------------*)
- (* Look for the @ bbs and handle *)
- (*---------------------------------------------------------------*)
-
- '@' : BEGIN;
-
- (*-------------------------------------------------------*)
- (* Check for valid format *)
- (*-------------------------------------------------------*)
-
- IF (word_cnt = 1) OR (address_string[2] <> ' ') THEN
- BEGIN;
- send_message(message_addr_fmt);
- active_tcb^.error_sw := TRUE;
- EXIT;
- END;
-
- (*-------------------------------------------------------*)
- (* Find the first address divider *)
- (* j = position of first address divider *)
- (*-------------------------------------------------------*)
-
- i := LENGTH(address_dividers);
- j := LENGTH(word_string) + 1;
-
- FOR k := 1 TO i DO
- BEGIN;
- l := POS(address_dividers[k], word_string);
- IF (l <> 0) AND (l < j) THEN
- j := l;
- END;
-
- (*-------------------------------------------------------*)
- (* Calculate secondary address size *)
- (* l = length of secondary address *)
- (*-------------------------------------------------------*)
-
- IF j < LENGTH(word_string) THEN
- l := LENGTH(word_string) - j
- ELSE
- l := 0;
-
- (*-------------------------------------------------------*)
- (* Verify that the sizes are ok and that we don't start *)
- (* with an address divider *)
- (*-------------------------------------------------------*)
-
- IF (j = 1)
- OR ((j - 1) >= SIZEOF(msg_to_at))
- OR (l >= SIZEOF(msg_to_h)) THEN
- BEGIN;
- send_message(message_addr_fmt);
- active_tcb^.error_sw := TRUE;
- EXIT;
- END;
-
- (*-------------------------------------------------------*)
- (* Set primary address *)
- (*-------------------------------------------------------*)
-
- msg_to_at := COPY(word_string, 1, j-1);
-
- IF active_port^.port_suppress_ssid THEN
- msg_to_at := strip_ssid(msg_to_at);
-
- (*-------------------------------------------------------*)
- (* Set secondary (hierarchial) address *)
- (*-------------------------------------------------------*)
-
- IF l > 0 THEN
- BEGIN;
- msg_to_h := COPY(word_string, j + 1, 255);
- msg_flag := msg_flag OR mf_h_receive;
- END
- ELSE
- BEGIN;
- msg_to_h := '';
- msg_flag :=
- msg_flag AND NOT mf_h_receive;
- END;
-
- (*-------------------------------------------------------*)
- (* Remove processed section *)
- (*-------------------------------------------------------*)
-
- address_string := subword(@address_string, 3, 0);
-
- END;
-
- (*---------------------------------------------------------------*)
- (* From someone else *)
- (*---------------------------------------------------------------*)
-
- '<' : BEGIN;
-
- IF (word_cnt = 1) OR (address_string[2] <> ' ')
- OR (LENGTH(word_string) >= SIZEOF(msg_from))
- OR ((NOT match_str(word_string, '+*'))
- AND (word_string[1] <> '=')) THEN
- BEGIN;
- send_message(message_addr_fmt);
- active_tcb^.error_sw := TRUE;
- EXIT;
- END;
-
- msg_from := word_string;
- msg_from_at := active_tcb^.uid_data.user_id;
-
- address_string := subword(@address_string, 3, 0);
-
- END;
-
- (*---------------------------------------------------------------*)
- (* Bid *)
- (*---------------------------------------------------------------*)
-
- '$' : BEGIN;
-
- word_string := COPY(subword(@address_string, 1, 1), 2, 255);
- upcase_str_var(word_string);
-
- IF LENGTH(word_string) > bid_len THEN
- BEGIN;
- send_message(message_addr_fmt);
- active_tcb^.error_sw := TRUE;
- EXIT;
- END;
-
- IF word_string = '' THEN
- BEGIN;
- msg_flag := msg_flag OR mf_bid_change;
- word_string := CHR(0);
- END;
-
- msg_bid := word_string;
-
- address_string := subword(@address_string, 2, 0);
-
- END;
-
- (*---------------------------------------------------------------*)
- (* Everything else *)
- (*---------------------------------------------------------------*)
-
- ELSE
- BEGIN;
- send_message(message_addr_fmt);
- active_tcb^.error_sw := TRUE;
- EXIT;
- END;
-
- END; (*----- End case statement -----------------------------------*)
-
- END; (*----- End WHILE loop -----------------------------------------*)
-
- END;